<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Pro Git - 简体中文版
</title>
    <meta content="http://www.w3.org/1999/xhtml; charset=utf-8" http-equiv="Content-Type"/>
    <link href="stylesheet.css" type="text/css" rel="stylesheet"/>
    <style type="text/css">
		@page { margin-bottom: 5.000000pt; margin-top: 5.000000pt; }</style>
  </head>
  <body class="calibre">
<h2 id="calibre_toc_35" class="calibre3">架设服务器</h2>

<p class="calibre2">现在我们过一边服务器端架设 SSH 访问的流程。本例将使用 <code class="calibre9">authorized_keys</code> 方法来给用户授权。我们还将假定使用类似 Ubuntu 这样的标准 Linux 发行版。首先，创建一个 'git' 用户并为其创建一个 <code class="calibre9">.ssh</code> 目录（译注：在用户的主目录下）。</p>

<pre class="calibre8"><code class="calibre9">$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh
</code></pre>

<p class="calibre2">接下来，把开发者的 SSH 公钥添加到这个用户的 <code class="calibre9">authorized_keys</code> 文件中。假设你通过 e-mail 收到了几个公钥并存到了临时文件里。重复一下，公钥大致看起来是这个样子：</p>

<pre class="calibre8"><code class="calibre9">$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
</code></pre>

<p class="calibre2">只要把它们加入 <code class="calibre9">authorized_keys</code> 文件（译注：本例加入到了文件尾部）：</p>

<pre class="calibre8"><code class="calibre9">$ cat /tmp/id_rsa.john.pub &gt;&gt; ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub &gt;&gt; ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub &gt;&gt; ~/.ssh/authorized_keys
</code></pre>

<p class="calibre2">现在可以使用 <code class="calibre9">--bare</code> 选项运行 <code class="calibre9">git init</code> 来设定一个空仓库，这会初始化一个不包含工作目录的仓库。</p>

<pre class="calibre8"><code class="calibre9">$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init
</code></pre>

<p class="calibre2">这时，Join，Josie 或者 Jessica 就可以把它加为远程仓库，推送一个分支，从而把第一个版本的工程上传到仓库里了。值得注意的是，每次添加一个新项目都需要通过 shell 登入主机并创建一个纯仓库。我们不妨以 <code class="calibre9">gitserver</code> 作为 <code class="calibre9">git</code> 用户和仓库所在的主机名。如果你在网络内部运行该主机，并且在 DNS 中设定 <code class="calibre9">gitserver</code> 指向该主机，那么以下这些命令都是可用的：</p>

<pre class="calibre8"><code class="calibre9"># 在 John 的电脑上
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master
</code></pre>

<p class="calibre2">这样，其他人的克隆和推送也一样变得很简单：</p>

<pre class="calibre8"><code class="calibre9">$ git clone git@gitserver:/opt/git/project.git
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
</code></pre>

<p class="calibre2">用这个方法可以很快捷的为少数几个开发者架设一个可读写的 Git 服务。</p>

<p class="calibre2">作为一个额外的防范措施，你可以用 Git 自带的 <code class="calibre9">git-shell</code> 简单工具来把 <code class="calibre9">git</code> 用户的活动限制在仅与 Git 相关。把它设为 <code class="calibre9">git</code> 用户登入的 shell，那么该用户就不能拥有主机正常的 shell 访问权。为了实现这一点，需要指明用户的登入shell 是 <code class="calibre9">git-shell</code> ，而不是 bash 或者 csh。你可能得编辑 <code class="calibre9">/etc/passwd</code> 文件：</p>

<pre class="calibre8"><code class="calibre9">$ sudo vim /etc/passwd
</code></pre>

<p class="calibre2">在文件末尾，你应该能找到类似这样的行：</p>

<pre class="calibre8"><code class="calibre9">git:x:1000:1000::/home/git:/bin/sh
</code></pre>

<p class="calibre2">把 <code class="calibre9">bin/sh</code> 改为 <code class="calibre9">/usr/bin/git-shell</code> （或者用 <code class="calibre9">which git-shell</code> 查看它的位置）。该行修改后的样子如下：</p>

<pre class="calibre8"><code class="calibre9">git:x:1000:1000::/home/git:/usr/bin/git-shell
</code></pre>

<p class="calibre2">现在 <code class="calibre9">git</code> 用户只能用 SSH 连接来推送和获取 Git 仓库，而不能直接使用主机 shell。尝试登录的话，你会看到下面这样的拒绝信息：</p>

<pre class="calibre8"><code class="calibre9">$ ssh git@gitserver
fatal: What do you think I am? A shell? （你以为我是个啥？shell吗？)
Connection to gitserver closed. （gitserver 连接已断开。）
</code></pre>

</body>
</html>
